package com.offics.loan.domain.repository;

import com.offics.loan.domain.entity.BankCard;

import java.util.List;
import java.util.Optional;

/**
 * 银行卡仓储接口
 */
public interface BankCardRepository {

    /**
     * 根据ID查询银行卡
     *
     * @param id 银行卡ID
     * @return 银行卡
     */
    Optional<BankCard> findById(Long id);

    /**
     * 根据用户ID查询银行卡列表
     *
     * @param userId 用户ID
     * @return 银行卡列表
     */
    List<BankCard> findByUserId(Long userId);

    /**
     * 根据用户ID查询默认银行卡
     *
     * @param userId 用户ID
     * @return 默认银行卡
     */
    Optional<BankCard> findDefaultByUserId(Long userId);

    /**
     * 根据银行卡号查询银行卡
     *
     * @param cardNo 银行卡号
     * @return 银行卡
     */
    Optional<BankCard> findByCardNo(String cardNo);

    /**
     * 保存银行卡
     *
     * @param bankCard 银行卡
     * @return 保存后的银行卡
     */
    boolean save(BankCard bankCard);

    /**
     * 保存银行卡并返回保存后的银行卡
     *
     * @param bankCard 银行卡
     * @return 保存后的银行卡
     */
    BankCard saveAndReturn(BankCard bankCard);

    /**
     * 更新银行卡
     *
     * @param bankCard 银行卡
     * @return 是否成功
     */
    boolean update(BankCard bankCard);

    /**
     * 删除银行卡
     *
     * @param id 银行卡ID
     * @return 是否成功
     */
    boolean deleteById(Long id);

    /**
     * 根据用户ID删除银行卡
     *
     * @param userId 用户ID
     * @return 是否成功
     */
    boolean deleteByUserId(Long userId);

    /**
     * 设置默认银行卡
     *
     * @param id 银行卡ID
     * @param userId 用户ID
     * @return 是否成功
     */
    boolean setDefault(Long id, Long userId);

    /**
     * 检查银行卡号是否存在
     *
     * @param cardNo 银行卡号
     * @return 是否存在
     */
    boolean existsByCardNo(String cardNo);
}
